package thinkingInJava.generics.Mix;

//: generics/Mixins.java
import java.util.*;

interface TimeStamped { long getStamp(); }

class TimeStampedImp implements TimeStamped {
private final long timeStamp;
public TimeStampedImp() {
  timeStamp = new Date().getTime();
}
public long getStamp() { return timeStamp; }
}

interface SerialNumbered { long getSerialNumber(); }

class SerialNumberedImp implements SerialNumbered {
private static long counter = 1;
private final long serialNumber = counter++;
public long getSerialNumber() { return serialNumber; }
}

interface Basic {
public void set(String val);
public String get();
}

class BasicImp implements Basic {
private String value;
public void set(String val) { value = val; }
public String get() { return value; }
}

class Mixin extends BasicImp
implements TimeStamped, SerialNumbered {
private TimeStamped timeStamp = new TimeStampedImp();
private SerialNumbered serialNumber =
  new SerialNumberedImp();
public long getStamp() { return timeStamp.getStamp(); }
public long getSerialNumber() {
  return serialNumber.getSerialNumber();
}
}

public class Mixins {
public static void main(String[] args) {
  Mixin mixin1 = new Mixin(), mixin2 = new Mixin();
  mixin1.set("test string 1");
  mixin2.set("test string 2");
  System.out.println(mixin1.get() + " " +
    mixin1.getStamp() +  " " + mixin1.getSerialNumber());
  System.out.println(mixin2.get() + " " +
    mixin2.getStamp() +  " " + mixin2.getSerialNumber());
}
} /* Output: (Sample)
test string 1 1132437151359 1
test string 2 1132437151359 2
*///:~

